package com.tanklab.signature.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tanklab.signature.common.util.ResultCode;
import com.tanklab.signature.config.FilePreviewConfig;
import com.tanklab.signature.ds.resp.CommonResp;
import com.tanklab.signature.entity.File;
import com.tanklab.signature.entity.Request;
import com.tanklab.signature.entity.User;
import com.tanklab.signature.mapper.FileMapper;
import com.tanklab.signature.mapper.RequestMapper;
import com.tanklab.signature.mapper.UserMapper;
import com.tanklab.signature.service.FilePreviewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriUtils;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

@Service
public class FilePreviewServiceImpl implements FilePreviewService {

    @Autowired
    private FileMapper fileMapper;

    @Autowired
    private RequestMapper requestMapper;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private FilePreviewConfig filePreviewConfig;

    @Override
    public CommonResp generatePreviewUrl(Long fileId, String openid) {
        CommonResp resp = new CommonResp();

        // 查询文件信息
        File file = fileMapper.selectById(fileId);
        if (file == null) {
            resp.setRet(ResultCode.NOT_MATCH_ERROR);
            resp.setMsg("文件不存在");
            return resp;
        }

        // 检查权限
        boolean hasPermission = false;
        boolean isApproved = false;

        // 情况1：检查是否是文件上传者
        boolean isUploader = openid.equals(file.getUploaderOpenid());
        if (isUploader) {
            hasPermission = true;
        }

        // 情况2：检查文件是否已审批通过，已审批的文件任何人都可以查看
        if (!hasPermission && file.getRequestId() != null) {
            Request request = requestMapper.selectById(file.getRequestId());
            if (request != null && "approve".equals(request.getStatus())) {
                isApproved = true;
                hasPermission = true;
            } else if (request != null && "pending".equals(request.getStatus())) {
                // 情况3：检查当前用户是否有权限审批该申请
                if (canUserApprove(openid, request)) {
                    hasPermission = true;
                }
            }
        }

        // 权限检查结果
        if (!hasPermission) {
            resp.setRet(ResultCode.PERMISSION_DENIED);
            resp.setMsg("无权预览此文件");
            return resp;
        }

        try {
            // 构建文件的完整访问路径
            String fileUrl = filePreviewConfig.getServerBaseUrl() + file.getFilePath();

            // 使用BASE64编码URL（kkFileView要求）
            String base64FileUrl = filePreviewConfig.encodeUrlToBase64(fileUrl);

            // 根据文件类型选择合适的预览类型
//            String officePreviewType = getPreviewType(file.getFileType());

            // 构建kkFileView预览URL
            String previewUrl = filePreviewConfig.getPreviewBaseUrl() +
                    "?url=" + base64FileUrl +
                    "&officePreviewType=image" +
                    "&baseUrl=base64";  // 表明URL是BASE64编码的

            // 构建预览信息
            JSONObject data = new JSONObject();
            data.put("fileId", file.getIdFile());
            data.put("fileName", file.getNameFile());
            data.put("fileType", file.getFileType());
            data.put("previewUrl", previewUrl);
            data.put("fileUrl", fileUrl);
            data.put("filePath", file.getFilePath());
            data.put("approved", isApproved);
            data.put("isUploader", isUploader);

            resp.setRet(ResultCode.SUCCESS);
            resp.setMsg("获取预览链接成功");
            resp.setData(data);

        } catch (Exception e) {
            e.printStackTrace();
            resp.setRet(ResultCode.ERROR);
            resp.setMsg("生成预览链接失败：" + e.getMessage());
        }

        return resp;
    }

    /**
     * 检查用户是否有权限审批该申请
     * @param openid 用户openid
     * @param request 申请信息
     * @return 是否有权限审批
     */
    private boolean canUserApprove(String openid, Request request) {
        // 不能审批自己的申请
        if (openid.equals(request.getInitiatorOpenid())) {
            return false;
        }

        // 获取当前用户和申请发起者的信息
        User currentUser = getUserByOpenid(openid);
        User initiator = getUserByOpenid(request.getInitiatorOpenid());

        if (currentUser == null || initiator == null) {
            return false;
        }

        // 审批权限规则：
        // 1. 权限高的可以审批权限低的
        // 2. 相同权限的可以互相审批
        return currentUser.getAuthority() >= initiator.getAuthority();
    }

    /**
     * 根据openid获取用户信息
     */
    private User getUserByOpenid(String openid) {
        QueryWrapper<User> userQuery = new QueryWrapper<>();
        userQuery.eq("openid", openid);
        return userMapper.selectOne(userQuery);
    }

    /**
     * 根据文件类型获取合适的预览类型
     */
//    private String getPreviewType(String fileType) {
//        if (fileType == null) {
//            return "office"; // 默认
//        }
//
//        fileType = fileType.toLowerCase();
//
//        // 图片类型
//        if (fileType.equals("jpg") || fileType.equals("jpeg") ||
//                fileType.equals("png") || fileType.equals("gif") ||
//                fileType.equals("bmp")) {
//            return "image";
//        }
//
//        // PDF类型
//        if (fileType.equals("pdf")) {
//            return "pdf";
//        }
//
//        // Office文档类型
//        if (fileType.equals("doc") || fileType.equals("docx") ||
//                fileType.equals("xls") || fileType.equals("xlsx") ||
//                fileType.equals("ppt") || fileType.equals("pptx")) {
//            return "officePage";
//        }
//
//        // 文本类型
//        if (fileType.equals("txt") || fileType.equals("md") ||
//                fileType.equals("json") || fileType.equals("xml") ||
//                fileType.equals("html") || fileType.equals("htm") ||
//                fileType.equals("sql") || fileType.equals("js") ||
//                fileType.equals("css") || fileType.equals("java") ||
//                fileType.equals("py") || fileType.equals("c") ||
//                fileType.equals("cpp")) {
//            return "officePage";
//        }
//
//        // 默认类型
//        return "officePage";
//    }
}